今天來介紹 Underscore 的 difference 語法 , 其語法如下 :
_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
結果 :
=> [1, 3, 4]
以上面的範例來說 , 其結果會返回 A 陣列中不存在於 B 陣列元素的集合
這方法其實相當好用 , 可是它只適用於基本資料型態 ,
若今天我們要應付比較複雜的物件呢 ?
我們新增了兩組集合 , 兩個集合不同的地方在於第一個集合 ( fundGroup1 ) 多了一個元素 基金2
當我使用 difference 語法來應付這種結構呢 , 如附圖 :
其顯示的結果不是我們要的 , 這就是我前面所說它只能應付基本型態 ,
由於 difference 內部的實做是使用 _contains , 而 _contains 的實做
是使用了 indexOf 來做搜尋的動作 , 因此才無法達到比對物件的效果 ,
那我們來改用另外一種方式吧 ,
我們使用 map 語法取得具有唯一性的 FUND_CODE , 如下 :
var t1 = _.map(fundGroup1,function(item){ return item.FUND_CODE})
var t2 = _.map(fundGroup2,function(item){ return item.FUND_CODE})
其結果如下圖 :
這樣我們就可以繼續使用 difference 來幫我們嚕 , 如下圖 :
我們得到正確的結果嚕 ~
接下來藉著 CODE3 回頭去抓 fundGroup 裡面的 CODE3 基金物件 ,
上述的迂迴的方式的確很麻煩 , 所以你也可以參考下列的方式 ..
_.filter(fundGroup1, function(obj){ return !_.findWhere(fundGroup2, obj); });
其結果如下圖 , 一樣的結果 , 只是在這裡需要使用到 findWhere 語法 ,
有興趣的人可以參考下列的文章 :
using underscore's “difference” method on objects
2014 / 10 / 31 修正
本文同步發布於 保政島 Underscore 使用 difference 情境